package com.zhiyou100.review.day018.homework;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;

/**
 * @packageName: HomeWork
 * @className: com.zhiyou100.review.day018.homework
 * @Description: TODO june 28,2020 作业
 * @author: yang
 * @date: 6/29/20
 */
public class HomeWork {
    public static void main(String[] args) throws IOException {
        HomeWork homeWork = new HomeWork();

        String filePath = "/Users/yang/Downloads/test/student.obj";


    }

    private static void testMatches(String s) {
        // 判断是不是只有数字和字母组成的 6-8 位的字符串
        String regex = "[0-9a-zA-Z]{6,8}";
        System.out.println(s + " 是不是只有数字和字母组成的 6-8 位 的字符串" + s.matches(regex));

        // 判断是不是邮箱地址 yanglei20011123@163.com
        regex = "\\w+@\\w+(\\.\\w+)+";
        /*
         * \\w+ 表示 用户名 yanglei20011123
         * \\w+@ 表示 用户名@ yanglei20011123@
         * \\w+@\\w+ 表示 用户名@企业名称 yanglei20011123@163
         *  \\.\\w+ 表示域名后缀 .com 或者 .cn .edu .gov
         *  (\\.\\w+)+ 表示多个后缀 .com.cn.gov
         *
         */
        System.out.println(s + " 邮箱地址" + s.matches(regex));

        // 判断是不是纯汉字
        regex = "^[\\u4E00-\\u9FA5]+$";
        System.out.println(s + " 纯数字" + s.matches(regex));

        // 判断是不是叠词 aaa aa bbb
        regex = "(.)\\1+";
        /*
         * 在正则中用 () 对规则进行分组，方便复用
         * . 表示任意字符
         * (.) 把数据封装，组名为1
         * \\1+ 第一组的内容重复 >= 1 次
         *
         */
        System.out.println(s + " 是不是叠词" + s.matches(regex));

        // 判断是不是 前后叠词 aaa aaabbb aaaabbbbcccccdddd
        regex = "((.)\\2+)+";
        // 定义字符串 记录叠词
        System.out.println(s + " 是不是前后叠词" + s.matches(regex));


    }

    private void testReplaceAll(String s) {
        // 删除所有的数字字符 把所有的数字子串替换为 ""
        String regex = "\\d+";
        // 表示 数字
        String ss = s.replaceAll(regex, "");
        System.out.println(s + " 删除所有的数字" + ss);

        // 替换所有汉字为 框
        regex = "^[\\u4E00-\\u9FA5]+$";
        ss = s.replaceAll(regex, "框");
        System.out.println(s + " 替换所有的汉字为 框 " + ss);

        // 删除所有的叠词
        regex = "(.)\\1+";
        ss = s.replaceAll(regex, "");
        System.out.println(s + " 删除所有的叠词 " + ss);

        // 删除所有的叠词为1个 aaaaaaabbbbccaa ------- abca
        regex = "(.)\\1+";
        ss = s.replaceAll(regex, "$1");
        // 在 replaceAll 中 可以通过 $ 来引用第一个参数的组
        System.out.println(s + " 删除所有的叠词为一个 " + ss);

        s = "我......我.......叫.........叫.........叫.........叫.........叫.........叫.........啊.........啊.........啊.........啊.........啊.........杨..........杨..........杨..........磊.........磊.........磊.........磊.........";
        s = s.replaceAll("\\.+", "");
        // . 替换为 空
        s = s.replaceAll("啊+", "");
        // 啊 替换为 空
        s = s.replaceAll("(.)\\1+", "$1");
        // 替换使用的叠词
        System.out.println(s);
    }

    /**
     * @Description: TODO 获取 字符串中所有的相邻的字符组成的数组： "123anc19--12soje98uyt23"---{123,19,12, 98, 23}
     * @name: testTrim
     * @param: [s]
     * @return: void
     * @date: 6/29/20 22:02
     * @author: yang
     */
    private static void testTrim(String s) {
        String[] split = s.split("\\D+");
        // 使用非数字切割
        for (String s1 : split) {
            System.out.println(s1);
        }

        split = s.split("\\.");
        // 使用 . 切割
        for (String s1 : split) {
            System.out.println("----" + s1);
        }


    }


    /**
     * @Description: TODO  把 file 中 id 对应的 学生的分数给 score
     * @name: updateOneStudent
     * @param: [filePath, id, score]
     * @return: void
     * @date: 6/29/20 21:24
     * @author: yang
     */
    private void updateOneStudent(String filePath, int id, double score) throws IOException {
        if (!isExistTheStudentId(id, filePath)) {
            throw new RuntimeException("该 id 不存在");
        }
        ArrayList<Student> allStudent = getAllStudent(filePath);
        for (int i = 0; i < allStudent.size(); i++) {
            Student student = allStudent.get(i);
            if (student.getId() == id) {
                // 找到，更改
                student.setScore(score);
                // 设置
                allStudent.set(i, student);
                break;
                // 跳出，更改
            }
        }

        inputArrayListToFilePath(allStudent, filePath);
        // 写入
    }


    /**
     * @Description: TODO 根据 id 删除一个学生
     * @name: delOneStudent
     * @param: [id, filePath]
     * @return: void
     * @date: 6/29/20 21:15
     * @author: yang
     */
    private void delOneStudent(int id, String filePath) throws IOException {
        if (!isExistTheId(id, filePath)) {
            // 不存在
            throw new RuntimeException("该学生不存在！");
        }

        ArrayList<Student> allStudent = getAllStudent(filePath);
        for (Object o : allStudent.toArray()) {
            Student o1 = (Student) o;
            if (o1.getId() == id) {
                allStudent.remove(o);
                break;
                // 找到 删除 跳出
            }
        }

        inputArrayListToFilePath(allStudent, filePath);
        // 写入到 文件中


    }

    /**
     * @Description: TODO 把一个 list 写入 目标文件中
     * @name: inputArrayListToFilePath
     * @param: [allStudent, filePath]
     * @return: void
     * @date: 6/29/20 21:21
     * @author: yang
     */
    private void inputArrayListToFilePath(ArrayList<Student> allStudent, String filePath) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));
        // 获取 输出
        for (Student student : allStudent) {
            objectOutputStream.writeObject(student);
            objectOutputStream.flush();
            // 遍历添加

        }
        objectOutputStream.close();
        // 关闭
    }


    /**
     * @Description: TODO 判断是否存在该学生
     * @name: isExistTheStudentId
     * @param: [id, filePath]
     * @return: boolean
     * @date: 6/29/20 20:58
     * @author: yang
     */
    private boolean isExistTheStudentId(int id, String filePath) throws IOException {
        boolean flag = false;
        ArrayList<Student> allStudent = getAllStudent(filePath);
        for (Student student : allStudent) {
            if (student.getId() == id) {
                // 是否存在
                flag = true;
                break;
            }
        }

        return flag;
    }

    /**
     * @Description: TODO 获取所有的学生对象
     * @name: getAllStudent
     * @param: [filPath]
     * @return: java.util.ArrayList<com.zhiyou100.review.day018.homework.Student>
     * @date: 6/29/20 20:45
     * @author: yang
     */
    private ArrayList<Student> getAllStudent(String filPath) throws IOException {
        ArrayList<Student> students = new ArrayList<>();
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filPath));
        while (true) {
            try {
                Object o = objectInputStream.readObject();
                // 读到末尾抛出 异常
                students.add((Student) o);
                // 添加到集合
            } catch (EOFException | ClassNotFoundException e) {
                break;
            }

        }
        objectInputStream.close();
        return students;
    }

    /**
     * @Description: TODO 添加一个学生对象到 filePath 文件中
     * @name: addOneStudent
     * @param: [s, filePah]
     * @return: void
     * @date: 6/29/20 20:56
     * @author: yang
     */
    private void addOneStudent(Student s, String filePah) throws IOException {
        ArrayList<Student> allStudent = getAllStudent(filePah);
        // 获取所有
        allStudent.add(s);
        inputArrayListToFilePath(allStudent, filePah);
        // 写入 filePath

    }

    /**
     * @Description: TODO 逐行读取键盘输入的内容  偶数行吸入a文件中  奇数行写入b文件中
     * @name: getInputOutTwoFile
     * @param: []
     * @return: void
     * @date: 6/29/20 20:06
     * @author: yang
     */
    private void getInputOutTwoFile(String a, String b) throws IOException {
        File fileA = new File(a);
        File fileB = new File(b);
        InputStream in = System.in;
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String end = "~";
        // 输入 ～ 停止
        BufferedWriter writerA = new BufferedWriter(new FileWriter(fileA));
        BufferedWriter writerB = new BufferedWriter(new FileWriter(fileB));
        // 创建高效输出流

        int flag = 0;
        // 计数器
        while (true) {
            flag++;
            String s = reader.readLine();
            // 读取一行

            if (!end.equals(s)) {
                // 不等于 ~ 继续执行
                if (flag % 2 == 1) {
                    // 是奇数
                    writerB.write(s);
                    writerB.newLine();
                    writerB.flush();
                    // 写到 b 文件
                } else {
                    // 是 偶数
                    writerA.write(s);
                    writerA.newLine();
                    writerA.flush();
                    // 写到 A 文件
                }


            } else {
                // 读到 ~ 跳出
                break;
            }

        }
        reader.close();
        writerA.close();
        // 关闭 流


    }


    /**
     * @Description: TODO 添加一个
     * @name: addOne
     * @param: [s, file]
     * @return: void
     * @date: 6/29/20 20:05
     * @author: yang
     */
    private void addOne(Student s, String file) throws IOException {
        File fileName = new File(file);
        // 创建 file
        if (!fileName.exists()) {
            // 如果文件不存在
            throw new RuntimeException(fileName.getAbsolutePath() + " 不存在！");
        }
        if (fileName.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException(fileName.getAbsolutePath() + " 是个文件夹！");
        }
        String student = s.toString();
        // 获取 字符串信息

        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        // 创建一个 缓冲字符流

        StringBuilder stringBuilder = new StringBuilder();
        // 创建一个 StringBuilder 放置信息

        while (true) {
            String line = reader.readLine();
            // 记录读到的数据，不加换行符
            if (line == null) {
                // 读到 末尾，退出
                break;
            }
            stringBuilder.append(line).append(System.lineSeparator());
            // + 换行符 放到 stringBuilder 中
        }
        reader.close();
        stringBuilder.append(student).append(System.lineSeparator());
        // 加入添加的学生信息

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        // 创建输入流
        writer.write(String.valueOf(stringBuilder));
        // 写入
        writer.flush();
        // 推送

        writer.close();
        // 关闭


    }


    /**
     * @Description: TODO 根据 id 删除一个
     * @name: delOne
     * @param: [id, filePath]
     * @return: void
     * @date: 6/29/20 20:05
     * @author: yang
     */
    private void delOne(int id, String filePath) throws IOException {
        File fileName = new File(filePath);
        // 创建 file
        if (!fileName.exists()) {
            // 如果文件不存在
            throw new RuntimeException(fileName.getAbsolutePath() + " 不存在！");
        }
        if (fileName.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException(fileName.getAbsolutePath() + " 是个文件夹！");
        }
        if (!isExistTheId(id, filePath)) {
            throw new RuntimeException("id " + id + " 不存在");
        }

        ArrayList<Student> all = getAll(filePath);
        // 获取所有的学生

        for (Object o : all.toArray()) {
            Student student = (Student) o;
            if (student.getId() == id) {
                // 找到 删除
                all.remove(student);
                break;
            }
        }

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        // 创建输出流
        for (Student student : all) {
            writer.write(student.toString());
            // student 写入
            writer.newLine();
            // 写入一个换行符
            writer.flush();
            // 刷新
        }
        writer.close();
        // 关闭


    }


    /**
     * @Description: TODO 获取所有的学生集合
     * @name: getAll
     * @param: [file]
     * @return: java.util.ArrayList<com.zhiyou100.review.day018.homework.Student>
     * @date: 6/29/20 20:04
     * @author: yang
     */
    private ArrayList<Student> getAll(String file) throws IOException {
        File fileName = new File(file);
        // 创建 file
        if (!fileName.exists()) {
            // 如果文件不存在
            throw new RuntimeException(fileName.getAbsolutePath() + " 不存在！");
        }
        if (fileName.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException(fileName.getAbsolutePath() + " 是个文件夹！");
        }

        ArrayList<Student> students = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        while (true) {
            String line = reader.readLine();
            // 读取一行，不加换行符
            if (line == null) {
                // 读到末尾，跳出
                break;
            }

            students.add(inStringGetStudent(line));
            // 添加到 students 中
        }
        reader.close();
        // 关闭 读取流

        return students;
    }

    /**
     * @Description: TODO 把 file 中 id 对应的 学生的分数给位 score
     * @name: updateOne
     * @param: [filePath, id, score]
     * @return: void
     * @date: 6/29/20 20:04
     * @author: yang
     */
    private void updateOne(String filePath, int id, double score) throws IOException {
        File fileName = new File(filePath);
        // 创建 file
        if (!fileName.exists()) {
            // 如果文件不存在
            throw new RuntimeException(fileName.getAbsolutePath() + " 不存在！");
        }
        if (fileName.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException(fileName.getAbsolutePath() + " 是个文件夹！");
        }
        if (!isExistTheId(id, filePath)) {
            throw new RuntimeException("id " + id + " 不存在");
        }

        ArrayList<Student> all = getAll(filePath);
        // 获取所有的学生

        for (int i = 0; i < all.size(); i++) {
            Student student = all.get(i);
            if (student.getId() == id) {
                // 找到，更改
                student.setScore(score);
                // 设置
                all.set(i, student);
                // 更改集合
                break;
            }
        }

        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        // 创建输出流
        for (Student student : all) {
            writer.write(student.toString());
            // student 写入
            writer.newLine();
            // 写入一个换行符
            writer.flush();
            // 刷新
        }
        writer.close();
        // 关闭
    }

    /**
     * @Description: TODO  判断是否存在该 id
     * @name: isExistTheId
     * @param: [id, filePath]
     * @return: boolean
     * @date: 6/29/20 20:03
     * @author: yang
     */
    private boolean isExistTheId(int id, String filePath) throws IOException {
        boolean flag = false;
        for (Student student : getAll(filePath)) {
            if (student.getId() == id) {
                // 找到 id 相同的 flag = true，跳出
                flag = true;
                break;
            } else {
                flag = false;
            }
        }
        return flag;

    }

    /**
     * @Description: TODO 从字符串中读取一个 student 对象
     * @name: inStringGetStudent
     * @param: [line]
     * @return: com.zhiyou100.review.day018.homework.Student
     * @date: 6/29/20 20:00
     * @author: yang
     */
    private Student inStringGetStudent(String line) {
        String[] split = line.split("-");
        int id = Integer.parseInt(split[0]);
        int age = Integer.parseInt(split[2]);
        String name = split[1];
        double score = Double.parseDouble(split[3]);
        return new Student(id, age, name, score);
    }

    /**
     * @Description: TODO 转换流 复制文本文件
     * @name: copy4
     * @param: [intoFile, outFile]
     * @return: void
     * @date: 6/29/20 19:50
     * @author: yang
     */
    private void copy4(String intoFile, String outFile) throws IOException {
        File into = new File(intoFile);
        File out = new File(outFile);
        if (!into.exists()) {
            // 不存在
            throw new RuntimeException("文件不存在");
        }

        if (into.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException("是个文件夹");
        }

        if (!out.exists()) {
            // 输出文件不存在
            throw new RuntimeException("输出文件不存在");
        }

        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(into), StandardCharsets.UTF_8);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(out), StandardCharsets.UTF_8);

        char[] chars = new char[100];

        while (true) {
            int read = inputStreamReader.read(chars);
            if (read == -1) {
                break;
            }
            outputStreamWriter.write(chars);
            outputStreamWriter.flush();
            // 写入刷新
        }

        inputStreamReader.close();
        outputStreamWriter.close();
        // 关流


    }


    /**
     * @Description: TODO 高效流 文本复制
     * @name: copy3
     * @param: [intoFile, outFile]
     * @return: void
     * @date: 6/29/20 19:39
     * @author: yang
     */
    private void copy3(String intoFile, String outFile) throws IOException {
        File into = new File(intoFile);
        File out = new File(outFile);
        if (!into.exists()) {
            // 不存在
            throw new RuntimeException("文件不存在");
        }

        if (into.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException("是个文件夹");
        }

        if (!out.exists()) {
            // 输出文件不存在
            throw new RuntimeException("输出文件不存在");
        }

        BufferedReader reader = new BufferedReader(new FileReader(into));
        BufferedWriter writer = new BufferedWriter(new FileWriter(out));

        while (true) {
            String s = reader.readLine();
            if (s == null) {
                // 读到末尾返回 null
                break;
            }
            writer.write(s);
            writer.newLine();
            writer.flush();
            // 刷新
        }
        reader.close();
        writer.close();
        // 关流


    }

    /**
     * @Description: TODO 使用 字符流 实现文件的复制
     * @name: copy2
     * @param: [intoFile, outFile]
     * @return: void
     * @date: 6/29/20 19:16
     * @author: yang
     */
    private void copy2(String intoFile, String outFile) throws IOException {
        File into = new File(intoFile);
        File out = new File(outFile);
        if (!into.exists()) {
            // 不存在
            throw new RuntimeException("文件不存在");
        }

        if (into.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException("是个文件夹");
        }

        if (!out.exists()) {
            // 输出文件不存在
            throw new RuntimeException("输出文件不存在");
        }

        FileReader fileReader = new FileReader(into);
        FileWriter fileWriter = new FileWriter(out);
        // 创建 字符流

        char[] chars = new char[100];
        while (true) {
            int read = fileReader.read(chars);
            if (read == -1) {
                // 到底了
                break;
            }
            fileWriter.write(chars);
            fileWriter.flush();
            // 刷新
        }
        fileReader.close();
        fileWriter.close();
    }

    /**
     * @Description: TODO 使用字节流实现文本文件的复制
     * @name: copy1
     * @param: [intoFile, outFile]
     * @return: void
     * @date: 6/29/20 19:03
     * @author: yang
     */
    private void copy1(String intoFile, String outFile) throws IOException {
        File into = new File(intoFile);
        File out = new File(outFile);
        if (!into.exists()) {
            // 不存在
            throw new RuntimeException("文件不存在");
        }

        if (into.isDirectory()) {
            // 是个文件夹
            throw new RuntimeException("是个文件夹");
        }

        if (!out.exists()) {
            // 输出文件不存在
            throw new RuntimeException("输出文件不存在");
        }

        FileInputStream fileInputStream = new FileInputStream(into);
        FileOutputStream fileOutputStream = new FileOutputStream(out);
        // 创建输入输出流

        byte[] bytes = new byte[100];
        // 读字节

        while (true) {
            int read = fileInputStream.read(bytes);
            // 读取
            if (read == -1) {
                // 读到末尾 返回 -1 退出
                break;
            }
            fileOutputStream.write(bytes);
            // 读入
            fileOutputStream.flush();
            // 刷新一下

        }
        fileOutputStream.close();
        fileInputStream.close();
        // 关流

    }
}

class Student implements Serializable {

    /**
     * @Description: TODO 随机获取一个学生
     * @name: randomOneStudent
     * @param: []
     * @return: com.zhiyou100.review.day018.homework.Student
     * @date: 6/29/20 20:39
     * @author: yang
     */
    public static Student randomOneStudent() {
        int id = RandomUtil.randomInt(1, 10000);
        int age = RandomUtil.randomInt(15, 30);
        String name = "张" + id;
        double score = NumberUtil.round(RandomUtil.randomDouble(0, 100), 2).doubleValue();
        return new Student(id, age, name, score);
    }

    private int id;
    private int age;
    private String name;
    private double score;

    @Override
    public String toString() {
        return id + "-" + name + "-" + age + "-" + score;
    }

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public Student(int id, int age, String name, double score) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.score = score;
    }
}